<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" />
<title>The wxPython wx Package</title>
<meta name="author" content="Patrick K. O'Brien" />
<meta name="author" content="Robin Dunn" />
<meta name="organization" content="Orbtech" />
<meta name="date" content="$Date$" />
<link rel="stylesheet" href="default.css" type="text/css" />
</head>
<body>
<div class="document" id="the-wxpython-wx-package">
<h1 class="title">The wxPython wx Package</h1>
<h2 class="subtitle" id="or-how-to-survive-the-new-wx-namespace-changes">Or, how to survive the new wx namespace changes.</h2>
<table class="docinfo" frame="void" rules="none">
<col class="docinfo-name" />
<col class="docinfo-content" />
<tbody valign="top">
<tr><th class="docinfo-name">Author:</th>
<td>Patrick K. O'Brien</td></tr>
<tr><th class="docinfo-name">Author:</th>
<td>Robin Dunn</td></tr>
<tr><th class="docinfo-name">Contact:</th>
<td><a class="first last reference external" href="mailto:pobrien&#64;orbtech.com">pobrien&#64;orbtech.com</a></td></tr>
<tr><th class="docinfo-name">Organization:</th>
<td><a class="first last reference external" href="http://www.orbtech.com/">Orbtech</a></td></tr>
<tr><th class="docinfo-name">Date:</th>
<td>$Date$</td></tr>
<tr><th class="docinfo-name">Revision:</th>
<td>$Revision$</td></tr>
</tbody>
</table>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#introduction" id="id2">Introduction</a></li>
<li><a class="reference internal" href="#why-change-anything" id="id3">Why change anything?</a></li>
<li><a class="reference internal" href="#what-does-the-new-wx-package-do" id="id4">What does the new wx package do?</a></li>
<li><a class="reference internal" href="#will-any-of-this-effect-my-existing-code" id="id5">Will any of this effect my existing code?</a></li>
<li><a class="reference internal" href="#what-about-all-the-other-modules-like-grid-html-and-stc" id="id6">What about all the other modules, like grid, html, and stc?</a></li>
<li><a class="reference internal" href="#how-do-i-use-this-new-wx-package" id="id7">How do I use this new wx package?</a></li>
<li><a class="reference internal" href="#what-are-the-issues-with-converting-old-code-to-use-the-new-wx-package" id="id8">What are the issues with converting old code to use the new wx package?</a></li>
<li><a class="reference internal" href="#where-can-i-find-example-programs-using-the-new-wx-syntax" id="id9">Where can I find example programs using the new wx syntax?</a></li>
</ul>
</div>
<div class="section" id="introduction">
<h1><a class="toc-backref" href="#id2">Introduction</a></h1>
<p>In the begining there was Python, and Python had modules, and Python
was good.  But after a time Guido looked on Python and saw that Python
needed organizational assistance, and so Guido took code from Python's
side and created Packages and then Python was very good.  About this
time wxPython was reborn, and wxPython used Packages, but being young
and trying to use a new technology wxPython did not know how to use
Packages effectivly.  wxPython was good, but dreamed of being much
better...</p>
<p>Now many years later, after tons of code reorganization and build
hacking wxPython has reached that goal.  In version 2.4.1 a prototype
of this new structure was introduced that dynamically built at import
time a new toplevel package named simply &quot;wx&quot; that contained all the
items from wxPython.wx but with the names edited to remove the wx
prefix.  Now in 2.5 the final phase of that switcheroo has been
completed and the <em>real</em> classes, functions and constants are now
located in the wx package, leaving some compatibility modules in
wxPython.wx.  This document should answer all the questions you might
have concerning the new wx package.  Please also take a look at the
<a class="reference external" href="MigrationGuide.html">2.5 Migration Guide</a> to see notes about other big differences in
this release.</p>
</div>
<div class="section" id="why-change-anything">
<h1><a class="toc-backref" href="#id3">Why change anything?</a></h1>
<p>This change is being made for a couple of reasons.  The first reason
is to discourage the use of <tt class="docutils literal">import *</tt>, which is a dangerous
technique that can create name conflicts and bloated namespaces.</p>
<p>The second reason is to remove what some perceive to be a &quot;wart.&quot;  For
example, the following code is rather ugly in that the &quot;wx&quot; prefix on
the wxFrame class name is no longer useful when you're using the wx
module prefix:</p>
<pre class="literal-block">
from wxPython import wx

class Frame(wx.wxFrame)
</pre>
<p>The new wx package allows you to write code like this, instead:</p>
<pre class="literal-block">
import wx

class Frame(wx.Frame)
</pre>
<p>The third reason is that the wxWindows project has considered doing
the same thing (implement a new wx namespace and drop the &quot;wx&quot; prefix)
and we want wxPython to lead the way.</p>
</div>
<div class="section" id="what-does-the-new-wx-package-do">
<h1><a class="toc-backref" href="#id4">What does the new wx package do?</a></h1>
<p>As mentioned in the Introduction, wxPython 2.4.1 introduced a way of
getting to this new syntax as quickly as possible.  It would import
the old names (like &quot;wxFrame&quot;) from the old package and then create new
names in the wx package  without the wx prefix, (like &quot;Frame&quot;.)
Starting with wxPython 2.5 the renaming is moved up to the wxPython
build step, so the real classes and etc. are actually named with the
new name (like &quot;Frame&quot;) and are located in the new wx package.</p>
<p>For compatibility the old wxPython package still exists, but now it is
populated with modules that simply import the new names and then
&quot;reverse-renames&quot; them to the old names.  It probably sounds a bit
complicated, but it is mostly automated and so it  doesn't cause
problems in most cases.</p>
</div>
<div class="section" id="will-any-of-this-effect-my-existing-code">
<h1><a class="toc-backref" href="#id5">Will any of this effect my existing code?</a></h1>
<p>No.  Your existing code will continue to work and be supported for
some time.  It will be up to you to decide when to switch to the new
syntax.  But all new documentation and code examples will use the new
syntax.  So don't wait too long.  You wouldn't want anyone calling you
old-fashioned, would you?</p>
<p>When you import from wxPython.wx and use a class with the old name,
such as wxButton, you are actually using the wx.Button class.  I
expect that the vast majority of the existing code should work fine
using this scheme.  The only things that may cause problems is if your
old code is depending on some of the implemtation details, or if you
are using other things that have changed in the API.  See the
<a class="reference external" href="MigrationGuide.html">Migration Guide</a> for more details.</p>
</div>
<div class="section" id="what-about-all-the-other-modules-like-grid-html-and-stc">
<h1><a class="toc-backref" href="#id6">What about all the other modules, like grid, html, and stc?</a></h1>
<p>There's more to the old wxPython than just the wxPython.wx module.
And we've got those extra modules covered as well.  Each of those
modules (as well as the lib subpackage) has been moved to the new wx
package and reverse-renamers have been placed in the wxPython package
as needed.</p>
</div>
<div class="section" id="how-do-i-use-this-new-wx-package">
<h1><a class="toc-backref" href="#id7">How do I use this new wx package?</a></h1>
<p>The wx package is automatically created when you install wxPython
version 2.4.1 or higher.  So all you have to do is:</p>
<pre class="literal-block">
import wx
</pre>
</div>
<div class="section" id="what-are-the-issues-with-converting-old-code-to-use-the-new-wx-package">
<h1><a class="toc-backref" href="#id8">What are the issues with converting old code to use the new wx package?</a></h1>
<p>Obviously, you need to change your import statements from:</p>
<pre class="literal-block">
from wxPython import wx
</pre>
<p>or:</p>
<pre class="literal-block">
from wxPython.wx import *
</pre>
<p>to:</p>
<pre class="literal-block">
import wx
</pre>
<p>Then you need to refer to wx attributes without a &quot;wx&quot; prefix, such
as:</p>
<pre class="literal-block">
class MyFrame(wx.Frame):
</pre>
<p>In most cases, existing code can be modified with a simple search and
replace.</p>
</div>
<div class="section" id="where-can-i-find-example-programs-using-the-new-wx-syntax">
<h1><a class="toc-backref" href="#id9">Where can I find example programs using the new wx syntax?</a></h1>
<p>The wxPython demo application and most of the sample apps have been
converted to use the new <tt class="docutils literal">import wx</tt> style of programming with
wxPython, so there are lots of examples to look at and to play with.
Here is one of them, it is the <tt class="docutils literal">simple</tt> sample.</p>
<pre class="literal-block">
#----------------------------------------------------------------------
# A very simple wxPython example.  Just a wx.Frame, wx.Panel,
# wx.StaticText, wx.Button, and a wx.BoxSizer, but it shows the basic
# structure of any wxPython application.
#----------------------------------------------------------------------

import wx


class MyFrame(wx.Frame):
    &quot;&quot;&quot;
    This is MyFrame.  It just shows a few controls on a wxPanel,
    and has a simple menu.
    &quot;&quot;&quot;
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title,
                          pos=(150, 150), size=(350, 250))

        # Create the menubar
        menuBar = wx.MenuBar()

        # and a menu 
        menu = wx.Menu()

        # add an item to the menu, using \tKeyName automatically
        # creates an accelerator, the third param is some help text
        # that will show up in the statusbar
        menu.Append(wx.ID_EXIT, &quot;E&amp;xit\tAlt-X&quot;, &quot;Exit this simple sample&quot;)

        # bind the menu event to an event handler
        self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT)

        # and put the menu on the menubar
        menuBar.Append(menu, &quot;&amp;File&quot;)
        self.SetMenuBar(menuBar)

        self.CreateStatusBar()
        

        # Now create the Panel to put the other controls on.
        panel = wx.Panel(self)

        # and a few controls
        text = wx.StaticText(panel, -1, &quot;Hello World!&quot;)
        text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
        text.SetSize(text.GetBestSize())
        btn = wx.Button(panel, -1, &quot;Close&quot;)
        funbtn = wx.Button(panel, -1, &quot;Just for fun...&quot;)

        # bind the button events to handlers
        self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn)
        self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn)

        # Use a sizer to layout the controls, stacked vertically and with
        # a 10 pixel border around each
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text, 0, wx.ALL, 10)
        sizer.Add(btn, 0, wx.ALL, 10)
        sizer.Add(funbtn, 0, wx.ALL, 10)
        panel.SetSizer(sizer)
        panel.Layout()

        # And also use a sizer to manage the size of the panel such
        # that it fills the frame
        sizer = wx.BoxSizer()
        sizer.Add(panel, 1, wx.EXPAND)
        self.SetSizer(sizer)
        

    def OnTimeToClose(self, evt):
        &quot;&quot;&quot;Event handler for the button click.&quot;&quot;&quot;
        print &quot;See ya later!&quot;
        self.Close()

    def OnFunButton(self, evt):
        &quot;&quot;&quot;Event handler for the button click.&quot;&quot;&quot;
        print &quot;Having fun yet?&quot;


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, &quot;Simple wxPython App&quot;)
        self.SetTopWindow(frame)

        print &quot;Print statements go to this stdout window by default.&quot;

        frame.Show(True)
        return True
        
app = MyApp(redirect=True)
app.MainLoop()


</pre>
</div>
</div>
</body>
</html>
